package cn.ssm.controller;

import com.google.code.kaptcha.Producer;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.util.Date;

@RequestMapping("/admin")
@Controller
public class CaptchaController {
    //常量定义: key: 全部大写, 单词之间使用下划线分割  value: 通常是小写, 以下划线分割
    private static final String KAPTCHA_SESSION_KEY = "HOME_KAPTCHA_SESSION_KEY";
    private static final String KAPTCHA_SESSION_DATE = "HOME_KAPTCHA_SESSION_DATE";
    //验证码的有效时间:ms
    private static final Long SESSION_TIMEOUT = 60 * 1000L;
    //验证成功: true
    //验证失败: false


    @Resource
    private Producer captchaProducer;

    @GetMapping("/captcha")
    /**
     * 生成并获取验证码图片
     *
     * 该方法用于创建一个验证码图片，并将其直接输出到HTTP响应中它首先设置响应头，以确保验证码图片不会被缓存，
     * 然后创建验证码文本和对应的图片，最后将图片写入响应流中
     *
     * @param request 用于获取ServletContext对象，以便存储验证码文本
     * @param response 用于设置响应头和输出验证码图片
     * @throws Exception 如果在创建或写入验证码图片过程中发生错误
     */
    public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws Exception {
        // 打印日志，用于调试
        System.out.println("================");

        // 设置响应头，确保验证码图片不会被缓存
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");

        // 设置响应内容类型为JPEG图片
        response.setContentType("image/jpeg");

        // 创建验证码文本
        String capText = captchaProducer.createText();

        // 将验证码文本存储在ServletContext中，以便后续验证
        request.getServletContext().setAttribute("captchaCode", capText);
        // 记录验证码生成的时间，用于后续可能的过期验证
        request.getServletContext().setAttribute("captchaDate", new Date());
        // 创建验证码图片
        BufferedImage bi = captchaProducer.createImage(capText);

        // 获取响应输出流，用于输出验证码图片
        ServletOutputStream out = response.getOutputStream();

        // 将验证码图片写入响应流
        ImageIO.write(bi, "jpg", out);

        // 尝试刷新输出流，确保验证码图片被正确发送
        try {
            out.flush();
        } finally {
            // 关闭输出流
            out.close();
        }
    }

}

